package com.atguigu.java;

/**
 * @author azzn1400820029
 * @create 2021-12-12 18:07
 */

/**
 * 快速排序
 * 通过一趟排序将待排序记录分割成独立的两部分，其中一部分记录的关键字均比另一部分关键字小，
 * 则分别对这两部分继续进行排序，直到整个序列有序。
 * @author shkstart
 * 2018-12-17
 */

public class QuickSort {
    private static void swap(int[] data, int i, int j) {
        int temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    private static void subSort(int[] data, int start, int end) {
        if (start < end) {
//			基数
            int base = data[start];
//			指针
            int low = start;
            int high = end + 1;

            while (true) {
//				从左往右找到大于base的数
                while (low < end && data[++low] - base <= 0)
                    ;
//				从右往左找到小于base的数
                while (high > start && data[--high] - base >= 0)
                    ;
//              触发break的情况只有low==high的时候
                if (low < high) {
                    swap(data, low, high);
                } else {
                    break;
                }
            }
//			最后high指向最后一个小于base的数，high右边都是大于base的数
//			交换之后左边都是小于start的值，右边都是大于start的值
            swap(data, start, high);

            subSort(data, start, high - 1);//递归调用
            subSort(data, high + 1, end);
        }
    }
    public static void quickSort(int[] data){
        subSort(data,0,data.length-1);
    }


    public static void main(String[] args) {
        int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
        System.out.println("排序之前：\n" + java.util.Arrays.toString(data));
        quickSort(data);
        System.out.println("排序之后：\n" + java.util.Arrays.toString(data));
    }
}


